
//   https://man7.org/linux/man-pages/man3/getopt.3.html

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
int main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;

    nsecs = 0;
    tfnd = 0;
    flags = 0;

    //optind代表了：argv中，下一个参数(下次将被处理)的下标，系统自动负责维护(调用者也可以修改)
    printf("optind = %d\n", optind); //系统将optind初始化为1，所以输出是1，

    while ((opt = getopt(argc, argv, "nt:")) != -1)
    {
        printf("当前的option-character =%c\n",opt);

        switch (opt)
        {
        case 'n':
            flags = 1;
            // printf("optarg=%s\n",optarg);
            /**
             * 此时打印：optarg=(null)
             * 因为n后面没有':',所以只是解析出了n(后面的参数要自己去处理，可以借助optind)
             * 
             */
            break;

        case 't':
            nsecs = atoi(optarg); // 如输入 ./out -t 59 ttt

            // printf("optarg=%s\n",optarg);
            // printf("optarg=%s\n",++optarg);
            /**
             * 因为t后面有':', 
             *  所以getopt解析出 t ，并解析处t的一个参数，放在了optarg中(注意，只解析一个参数)
             * 
             */

            /* 
                当输入 ./out -t 但是并没有输入t的参数时，
                getopt返回?，以提示调用者：缺少参数
            */
            tfnd = 1;
            break;

        case 'x':
            printf("this is -x\n");
            // printf("optarg=%s\n",optarg); (后面的参数要自己去处理，可以借助optind)
            //此时打印：optarg=(null)
            break;

        default: /* '?' */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d\n",
           flags, tfnd, nsecs, optind);

    // if (optind >= argc)
    // {
    //     fprintf(stderr, "Expected argument after options\n");
    //     exit(EXIT_FAILURE);
    // }

    printf("argv[optind-1] = %s\n", argv[optind-1]);
    printf("argv[optind] = %s\n", argv[optind]);

    /* Other code omitted */

    exit(EXIT_SUCCESS);
}